package main

import (
	"encoding/json"
	"fmt"
)

//初始化连接器对象
var h = hub{
	c: make(map[*connection]bool),
	u: make(chan *connection),
	b: make(chan []byte),
	r: make(chan *connection),
}

type hub struct {
	//注册了连接器
	c map[*connection]bool
	b chan []byte      //从连接器发送的信息
	r chan *connection //从连接器注册请求
	u chan *connection //销毁请求
}

//处理ws的逻辑实现
func (h *hub) run() {
	//监听数据管道，在后端不断处理管道数据
	for {
		//根据不同的数据管道，处理不同的逻辑
		select {
		case c := <-h.r:
			//标志注册了
			h.c[c] = true
			//组装data数据
			c.data.Ip = c.ws.RemoteAddr().String()
			//更新类型
			c.data.Type = "handshake"
			c.data.UserList = user_list
			data_b, _ := json.Marshal(c.data)
			c.sc <- data_b
		case c := <-h.u:
			//判断map里是否存在要删除的数据
			if _, ok := h.c[c]; ok {
				delete(h.c, c)
				close(c.sc)
			}
		case data := <-h.b:
			//处理数据流转，将数据同步到所有用户
			//c是具体的每一个连接
			for c := range h.c {
				select {
				//将数据同步
				case c.sc <- data:
					fmt.Printf("data:%s\n", data)
				default:
					delete(h.c, c)
					close(c.sc)
				}
			}
		}
	}
}
